#ifndef CLINK_ROUTER_ERRORHANDLER_H
#define CLINK_ROUTER_ERRORHANDLER_H

#include "IRouteHandler.h"
#include "../Utils/ResponseUtils.h"
#include "../error/Error.h"
#include "../CLink_Export.h"

#include <functional>

namespace CLink
{
namespace Router
{

/**
 * @brief 错误处理器
 *
 * 用于处理路由过程中的各种错误，返回适当的错误响应。
 */
class CLINK_CLASS ErrorHandler : public IRouteHandler
{
public:
    /**
     * @brief 错误处理函数类型
     */
    using ErrorHandlerFunction = std::function<void(
        RequestContext &,
        const CLink::Error::CLinkException &)>;

    /**
     * @brief 构造函数
     * @param handler 错误处理函数
     */
    explicit ErrorHandler(ErrorHandlerFunction handler = nullptr);

    /**
     * @brief 处理HTTP请求
     * @param context 请求上下文
     * @return 总是返回true
     */
    bool handle(RequestContext &context) override;

    /**
     * @brief 检查路由是否匹配请求
     * @param context 请求上下文
     * @return 总是返回true，因为这是一个兜底处理器
     */
    bool matches(const RequestContext &context) const override;

    /**
     * @brief 获取路由优先级
     * @return 总是返回最低优先级
     */
    int getPriority() const override;

    /**
     * @brief 设置错误处理函数
     * @param handler 错误处理函数
     * @return 当前对象的引用，支持链式调用
     */
    ErrorHandler &setHandler(ErrorHandlerFunction handler);

    /**
     * @brief 处理特定错误
     * @param context 请求上下文
     * @param error 错误对象
     */
    void handleError(RequestContext &context,
                        const CLink::Error::CLinkException &error);

private:
    ErrorHandlerFunction m_handler; ///< 错误处理函数

    /**
     * @brief 默认错误处理函数
     * @param context 请求上下文
     * @param error 错误对象
     */
    void defaultErrorHandler(RequestContext &context,
                                const CLink::Error::CLinkException &error);
};

} // namespace Router
} // namespace CLink

#endif // CLINK_ROUTER_ERRORHANDLER_H